<?php
/** .-------------------------------------------------------------------
 * |  Software: [HDPHP framework]
 * |      Site: www.hdphp.com  www.hdcms.com
 * |-------------------------------------------------------------------
 * |    Author: 向军 <2300071698@qq.com>
 * |    WeChat: aihoudun
 * | Copyright (c) 2012-2019, www.houdunwang.com. All Rights Reserved.
 * '-------------------------------------------------------------------*/

namespace app\home\controller;
use houdunwang\db\Db;
use houdunwang\request\Request;
use system\model\Article;
use system\model\Module;
use system\model\Category;
class Entry
{
	//在这里定义一个属性，通过构造函数来实现看是加载的手机的页面还是网站的页面；
	protected $template;
	public function __construct ()
	{
		//后面加上后面的v什么的是为了设置模板
		$this->template = 'template/' . (IS_MOBILE ? 'mobile' : 'web'). '/' . v('config.template');
//		p($this->template);die;
//		p($this->template);die();//template/web 当加上了 v('config.template')，网站模板的配置项后打印结果是//template/web/default
		//定义模板路径常量(常量的名字，和常量的值)；
		define(__TEMPLATE__,__ROOT__.'/' . $this->template);
//		var_dump(IS_MOBILE);
		//注意里面的die
		$res=$this->runModule();
	}
	/**
	 * 搜索函数
	 */
	public function search ()
	{
		//1.首先就是要就收get传递的搜索的关键词
		$str = Request::get( 'keyword' );
		$headConf      = [
			'title' => '搜索结果' ,
			'css'   => [ 'list_article' ] ,
		];
		$searchKeyword =urldecode($str);
//		p($searchKeyword);die;
		//2.在数据表[article]搜索跟$searchKeyword相关的内容（然后注意这里是模糊查询）
		$search_data = Db::table( 'article' )->where( 'arc_title' , 'like' , "%$searchKeyword%" )->get();
//		p($search_data);die();
		//将搜索关键词写入数据库
		if(Db::table('addons_search')->where('keyword',$searchKeyword)->first()){
			//找的见，将click搜索次数+1
			Db::table('addons_search')->where('keyword',$searchKeyword)->increment('click',1);
		}else{
			//将搜索词写入数据库
			Db::table('addons_search')->insert(['keyword'=>$searchKeyword,'click'=>1]);
		}
//这里还应注意的是是这里还要重新写一个页面用来进行搜索成功的跳转页面；这里显示关键词对应的文章也欧式列表页，而且这里循环的数据是关键字的数据
		//然后就是要将热门关键字循环出来
		return view( $this->template . '/search.html' , compact( 'headConf' , 'search_data' ) );
	}

	/**
	 * 网站首页
	 * @return bool|mixed
	 */
    public function index()
    {
    	//因为框架不能识别?m=pic&action=controller/index/index这样的地址栏参数，而且但有这样的参数的时候都会跳转到
//		home/entry/index这个方法中-----so讲这个文件当做一个跳板来访问一些插件类
		//http://cms.ishilf.com/index.php?m=pic&action=controller/index/index
        //希望地址栏是上面这样的时候就能访问到addons\pic\controller\index这个类下的这个方法；
		//(new \addons\pic\controller\Index())->add();
		//测试自己定义wubin目录中的类是否可以被自动加载，需要结合composer.json文件来处理
		//(new \wubin\student\controller\Stu())->index();

//		因为APP/home/entry/index的方法是一个跳板，所以将运行模块加载类和方法的函数在这里进行调用
		//运行模板函数
//		$res=$this->runModule();
//		if($res!==false){
//			return $res;//这里的return以后就是不再进行下面的语句了，就不会加载默认的页面了；
//		}
//        return View::with('framework', 'HDPHP')->make();
		$headConf = [
			'title'=>'首页',
			'css'=>['index'],
		];
//		p($this->template);die;
		return view($this->template . '/index.html',compact('headConf'));
    }
    //so-------在跳板文件中进行创建模板的运行函数
	/*
	 * 实例化地址栏中模块，加载模块中的类然后调用里面的方法module\base\controller\Wx；
	 *
	 */
	protected function runModule(){
		//1.1参考地址
//		http://wechat.wangyahe.com/blog/index.php?m=pic&action=controller/login/index
		//最终执行：(new \addons\pic\controller\Index())->add();
		//获得get参数m,就是获得模块名称
		$m=Request::get('m');
		//1.8,为了考虑，如果你数据库没有这个模块，那就是说在项目里面没有模块这个目录，所以没有这个类和里面的方法，那么addons/不会有这个模块，没必要实例化了
		//用来获得模块数据库中的数据，获得模块名称这一条数据
       $module=Module::where('module_name',$m)->first();
		//获得get参数action--//	http://wechat.wangyahe.com/blog/index.php?m=pic&action=controller/login/index
		$action=Request::get('action');
//		p($action);die();controller/login/index
		//只有当以上的两个参数同时存在的时候才可以访问到相应的类和方法
		if($module && $m && $action){
			//将action里面的controller/login/index转换成数组，so进行分割
			$info=explode('/',$action);
//			p($info);die();
//下面是其打印的结果
//			Array
//			(
//				[0] => controller
//				[1] => login
//			    [2] => index
//            )
			//然后进行命名空间的拼接
//			$class = "\addons\\".$m."\\".$info[1]."\\".ucfirst( $info[ 1 ] );//这里使用UCfirst是因为类名的首字母是大写的。
//			$class = "\addons\\" . $m . '\\' . $info[ 0 ] . '\\' . ucfirst( $info[ 1 ] );
			//因为这里要判断是否是系统模块，所以要进行修改，如果是1的话就是系统模块，那系统模块就需要去module里面进行实例化（在设计模块的添加哪里没有module_is_system在这个字段，所以要手动的在数据库中进行添加）
			$class = ( $module[ 'module_is_system' ] == 1 ? 'module' : 'addons' ) . "\\" . $m . '\\' . $info[ 0 ] . '\\' . ucfirst( $info[ 1 ] );
//			houdunwang\view\build\Base Object
//			(
//				[file:protected] => module/base/template/wx/post.php
//			[expire:protected] =>
//    [path:protected] => app/home/view/entry
//			[content:protected] =>
//    [compileFile:protected] =>
//)
//						var_dump(call_user_func_array( [ new $class , $info[ 2 ] ] , [] ));die();
//			object(houdunwang\view\build\Base)#51 (5) { ["file":protected]=> string(32) "module/base/template/wx/post.php" ["expire":protected]=> NULL ["path":protected]=> string(19) "app/home/view/entry" ["content":protected]=> NULL ["compileFile":protected]=> NULL }

			//			call_user_func_array()
//			p($class);die();
//			module\base\controller\Wx
			//			(new $class)->add();die;这句话就相当于下面这句话
//			p(call_user_func_array( [ new $class , $info[ 2 ] ] , [] ));die();
//			return call_user_func_array( [ new $class , $info[ 2 ] ] , [] );
			//(new $class)->add();
			//call_user_func_array面向对象ppt
			//1.6
			//1.1参考地址
//		http://wechat.wangyahe.com/blog/index.php?m=pic&action=controller/login/index
			//最终执行：(new \addons\pic\controller\Index())->add();
			die( call_user_func_array( [ new $class , $info[ 2 ] ] , [] ) );
		}
		//下面这一步是因为但运行了模块以后还会显示entry的模板页面，所以在上面的index方法中进行判断，当运行了模块的方法后就不显示entry的模板了。
		//当模块没有实例化到的时候才返回的是false；

	}//运行模块函数结束

	/*
 * 栏目首页
 */
	public function category(){
		//这里是一个前台的title和加载css样式的配置项;
		$headConf = [
			'title'=>'列表页',
			'css'=>['list_article'],
		];
		$cate_id = Request::get('cate_id');
//		p($cate_id);die();//16,这里的16就是16.html只不过这里是将原来的通过路由省略掉了；
		$cms_field = Category::find($cate_id);
		return view($this->template . '/list.html',compact('headConf','cms_field'));
	}
	/*
	 * 文章的内容页的函数创建为了实现一个url地址
	 */
	public function content(){
		//首先通过get参数获得文章的id 即arc_id
//		$arc_id=Request::get('arc_id');
		//然后到对应的文章表中找到对应的文章数据
//		$data=Article::find($arc_id);
		//然后将找到的对应的文章的数据分配到模板中(note:这里在调用模板的时候时可以使用自己定义的调用模板的函数)
//		return view($this->template.'/content.html',compact('data'));
//		$headConf = [
//			'title'=>$cms_field['arc_title'],
//			'css'=>['page'],
//		];
//		点击次数自增1
//		Db::table("article")->where('arc_id',$arc_id)->increment('arc_click',1);
//		return view( $this->template . '/content.html' , compact( 'headConf','cms_field' ) );
		$arc_id = Request::get( 'arc_id' );
		//找对应数据
		$cms_field = Article::find( $arc_id );
		$headConf = [
			'title'=>$cms_field['arc_title'],
			'css'=>['page'],
		];
		//点击次数自增1
		Db::table("article")->where('arc_id',$arc_id)->increment('arc_click',1);
		return view( $this->template . '/content.html' , compact( 'headConf','cms_field' ) );
	}//文章内容函数结束

}